package edu.unice.simul.vue;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;

import edu.unice.simul.modele.contenus.mobiles.Humain;
import edu.unice.simul.modele.enums.Age;
import edu.unice.simul.modele.enums.Sociabilite;

/**
 * Fenêtre d'édition d'un humain
 * 
 * @author Romain Ciaccafava
 * 
 */
public class EditFrame extends JFrame {
	private static final long serialVersionUID = 6511209277989904931L;

	private JButton annuler = new JButton("Annuler");
	private JButton ok = new JButton("OK");
	private JPanel valuesPanel = new JPanel();
	private JComboBox trancheAge = new JComboBox(Age.values());
	private JComboBox sociabilite = new JComboBox(Sociabilite.values());
	private SpinnerModel modelSpinner = new SpinnerNumberModel(100, 0, 100, 1);
	private JSpinner niveauVieValue = new JSpinner(modelSpinner);

	private Humain humain;

	public EditFrame(Humain humain) {
		this.humain = humain;
		buildUI();
		updateFromModel();
		addListeners();
		pack();
		setResizable(false);

		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

		setLocation((screenSize.width - getWidth()) / 2,
				(screenSize.height - getHeight()) / 2);
	}

	/**
	 * Séléctionne les valeurs des champs de la fenêtre en fonction du modèle
	 */
	private void updateFromModel() {
		trancheAge.setSelectedItem(humain.getAge());
		sociabilite.setSelectedItem(humain.getSociabilite());
		niveauVieValue.setValue((int) humain.getPrcVie());
	}

	/**
	 * Construit l'interface
	 */
	private void buildUI() {
		setLayout(new FlowLayout());
		JLabel trancheAgeLabel = new JLabel("Tranche d'age :");
		JLabel sociabiliteLabel = new JLabel("Sociabilité :");
		JLabel niveauVieLabel = new JLabel("Niveau de vie :");

		this.setTitle("Edition");
		setLayout(new BorderLayout());
		valuesPanel.setLayout(new GridLayout(4, 3));
		valuesPanel.setBorder(BorderFactory.createTitledBorder("Humain"));
		niveauVieValue.setSize(2, 2);

		valuesPanel.add(trancheAgeLabel);
		valuesPanel.add(trancheAge);
		valuesPanel.add(sociabiliteLabel);
		valuesPanel.add(sociabilite);
		valuesPanel.add(niveauVieLabel);
		valuesPanel.add(niveauVieValue);

		add(valuesPanel, BorderLayout.NORTH);

		JPanel buttonsPanel = new JPanel(new FlowLayout());
		buttonsPanel.add(annuler);
		buttonsPanel.add(ok);

		add(buttonsPanel, BorderLayout.SOUTH);
	}

	/**
	 * Ajoute les écouteurs
	 */
	private void addListeners() {
		ok.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				if (verified()) {
					humain.setAge(Age.values()[trancheAge.getSelectedIndex()]);
					humain.setSociabilite(Sociabilite.values()[sociabilite
							.getSelectedIndex()]);
					humain.setPrcVie((double) ((Integer) niveauVieValue.getValue()));
					setVisible(false);
					ConfigFrame.refreshHumain();

				}
			}
		});

		annuler.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				setVisible(false);
			}
		});
	}

	/**
	 * Vérifie que les valeurs entrées après édition sont correctes
	 */
	private boolean verified() {
		int value = 0;
		try {
			value = (Integer) niveauVieValue.getValue();
		} catch (Exception e) {
			JOptionPane.showMessageDialog(this,
					"La vie des humains doit être comprise entre 0 et 100" + value);
			return false;
		}
		if (value < 0 || value > 100) {
			JOptionPane.showMessageDialog(this,
					"La vie des humains doit être comprise entre 0 et 100" + value);
			return false;
		}
		return true;
	}
}
